home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / LEZIONI / LEZIONE5.TXT < prev    next >
Text File  |  1994-11-05  |  18KB  |  393 lines

  1.  
  2.  CORSO DI ASSEMBLER - LEZIONE 5
  3.  
  4. In questa lezione tratteremo lo scorrimento orizzontale e verticale delle
  5. figure, nonche' alcuni effetti speciali.
  6.  
  7. Cominciamo dallo scorrimento orizzontale: l'Amiga ha un registro speciale
  8. dedicato allo scorrimento, il BPLCON1 ($dff102), che puo' far scorrere di
  9. un pixel alla volta verso destra i bitplane per un massimo di 15 pixel.
  10. Cio' e' ottenuto dal copper ritardando il trasferimento dei dati dei bitplane,
  11. che arrivano "dopo" di uno o piu' pixel. Si possono inoltre scorrere
  12. separatamente i bitplanes pari e quelli dispari: i bitplanes dispari sono
  13. chiamati PLAYFIELD 1 (1,3,5), mentre quelli pari PLAYFIELD 2 (2,4,6).
  14. Il $dff102, lungo una word, e' diviso in 2 byte: quello alto, ossia quello
  15. a sinistra, ($xx00), composto dai bit dal 15 all'8, non e' utilizzato e bisogna
  16. lasciarlo a zero, mentre il byte basso ($00xx) controlla lo scroll:
  17.  
  18.     $dff102, BPLCON1 - Bit Plane Control Register 1
  19.  
  20.     BITS        NOME-FUNZIONE
  21.  
  22.     15    -    X
  23.     14    -    X
  24.     13    -    X
  25.     12    -    X
  26.     11    -    X
  27.     10    -    X
  28.     09    -    X
  29.     08    -    X
  30.     07    -    PF2H3    \
  31.     06    -    PF2H2     \ 4 bit per scroll PLANES PARI (playfield 2)
  32.     05    -    PF2H1     /
  33.     04    -    PF2H0    /
  34.     03    -    PF1H3    \
  35.     02    -    PF1H2     \4 bit per scroll PLANES DISPARI (playfield 1)
  36.     01    -    PF1H1     /
  37.     00    -    PF1H0    /
  38.  
  39. In pratica si deve agire sulla word in maniera simile ai registri colore:
  40. mentre nei registri colore si agisce su 3 componenti RGB, che vanno da 0 a 15,
  41. ossia da 0 a $F, qua agiamo su 2 sole componenti che vanno da $0 a $f, come
  42. il GREEN e BLU del $dff180 (COLOR0):
  43.  
  44.     dc.w    $102,$00XY    ; BPLCON1 - dove: X= scroll bitplanes PARI
  45.                 ;          Y= scroll bitplanes DISPARI
  46.  
  47. Alcuni esempi: (per la Copperlist)
  48.  
  49.     dc.w    $102,$0000    ; BPLCON1 - scroll zero, posizione normale
  50.     dc.w    $102,$0011    ; BPLCON1 - scroll = 1 in entrambi i playfield,
  51.                 ; ossia in tutta la figura
  52.     dc.w    $102,$0055    ; BPLCON1 - scroll = 5 per tutta la figura
  53.     dc.w    $102,$00FF    ; "" scroll al massimo (15) per tutta la figura
  54.     dc.w    $102,$0030    ; "" scroll = 3 solo per i bitplanes PARI
  55.     dc.w    $102,$00b0    ; "" scroll = $B solo per i bitplanes DISPARI
  56.     dc.w    $102,$003e    ; "" scroll = 3 per i bitplanes PARI e di $e
  57.                 ; per i bitplanes dispari
  58.  
  59. niente di piu' facile! Basta cambiare il valore di scroll ogni FRAME per
  60. screare uno scorrimento dell'intero schermo con un solo MOVE!!!
  61.  
  62. Caricate l'esempio Lezione5a.s per vedere in pratica il funzionamento.
  63.  
  64. In questo esempio il $dff102 (BPLCON1) viene cambiato all'inizio della
  65. COPPERLIST, dunque si muove tutta la figura. E' possibile mettere molti
  66. $dff102 (BPLCON1) a varie linee dello schermo con la tecnica dei WAIT:
  67. nell'Esempio Lezione5b.s ce ne sono due, che fanno scorrere separatamente la
  68. scritta "COMMODORE" e "AMIGA".
  69. Mettendo un $dff102 (BPLCON1) per linea con i WAIT, si possono fare i noti
  70. effetti di ondeggiamento delle figure.
  71.  
  72. Vediamo ora lo scorrimento verticale.
  73. Il modo piu' semplice per fare questo scorrimento e' di puntare piu' in alto o
  74. piu' in basso nella figura i puntatori ai bitplanes in copperlist, in modo
  75. che la figura sembri piu' "alta" o piu' "bassa". Immaginiamo di vedere una
  76. immagine attraverso un foro rettangolare, una specie di finestra (il video):
  77.  
  78.      ---------------
  79.     |        | 1
  80.     |        | 2
  81.     |     AMIGA    | 3
  82.     |        | 4
  83.     |        | 5
  84.      ---------------
  85.  
  86.  Vediamo in questo caso la scritta AMIGA al centro della finestra, e abbiamo
  87.  puntato i bitplane alla linea 1 (cioe' lo schermo inizia con la linea 1,
  88.  per cui AMIGA si trova alla linea 3).
  89.  Se puntiamo lo schermo alla linea 2, cosa succede???
  90.  
  91.      ---------------
  92.     |        | 2
  93.     |     AMIGA    | 3
  94.     |        | 4
  95.     |        | 5
  96.     |        | 6
  97.      ---------------
  98.  
  99. Succede che AMIGA "sale" perche' la finestra (il video) scende, ossia punta
  100. piu' in basso nella figura. Essendo il moto relativo, se vediamo dal finestrino
  101. di un treno in corsa un albero che si sposta, in realta' l'albero e' "fermo" e
  102. noi ci spostiamo. Qua succede una cosa analoga. Ma per far andare in alto o
  103. in basso una figura, quanto dobbiamo aggiungere o diminuire ai puntatori dei
  104. bitplanes??? I byte di una linea. Ossia 40 per una figura in LOW RES 320x256
  105. e 80 per una figura in HIGH RES 640x256, infatti esaminiamo questo caso:
  106.  
  107.     1234567890
  108.     ..........
  109.     ....++....
  110.     ...+..+...
  111.     ...++++...
  112.     ...+..+...
  113.     ...+..+...
  114.     ..........
  115.  
  116. Abbiamo un ipotetico bitplane con 10 byte per linea, che puo' essere a zero (.)
  117. o ad 1 (+), in questo caso raffigura una "A". Per spostare la "A" in alto,
  118. dobbiamo "puntare" una linea piu' in basso, ossia 10 bytes piu' in basso, e
  119. per puntare piu' in basso, occorre AGGIUNGERE 10 (add.l #10,puntatori)
  120.  
  121.     1234567890
  122.     ....++....
  123.     ...+..+...
  124.     ...++++...
  125.     ...+..+...
  126.     ...+..+...
  127.     ..........
  128.     ..........
  129.  
  130. Allo stesso modo, per farla "scendere", dobbiamo puntare una linea piu' in
  131. alto, ossia 10 bytes piu' in alto (SUB.L #10,puntatori):
  132.  
  133.     1234567890
  134.     ..........
  135.     ..........
  136.     ....++....
  137.     ...+..+...
  138.     ...++++...
  139.     ...+..+...
  140.     ...+..+...
  141.  
  142. In pratica per fare questo dobbiamo ricordarci che i puntatori in copperlist
  143. hanno l'indirizzo dei plane (che noi cambieremo) divisi in 2 word. Il problema
  144. e' facilmente risolvibile con una lieve modifica della routine di puntamento
  145. dei bitplane, infatti dobbiamo "PRENDERE" l'indirizzo dei bitplanes dalla
  146. copperlist (operazione contraria), aggiungere o sottrarre 40 per lo scroll,
  147. e rimettere il nuovo indirizzo nella copperlist con la vecchia routine di
  148. puntamento. Vedetevi l'esempio Lezione5c.s che usa questo sistema.
  149.  
  150. Ora caricatevi l'esempio Lezione5d.s, in cui sono presenti le due routines
  151. di scroll orizzontale e verticale contemporaneamente.
  152.  
  153. In Lezione5d2.s troverete un'altra applicazione dello scroll orizzontale
  154. insieme al $dff102 (bplcon1), ossia la distorsione in movimento.
  155.  
  156. Vedremo ora i registri piu' importanti per gli effetti speciali video Amiga,
  157. ossia i MODULI: $dff108 e $dff10a (BPL1MOD e BPL2MOD). Ci sono due registri
  158. modulo perche' si puo' cambiare il modulo separatamente per i bitplanes pari
  159. e per quelli dispari, come il BPLCON1 ($dff102). Per operare sulla nostra
  160. figura a 3 bitplanes dovremo agire su entrambi i registri.
  161. Avrete notato che quando una immagine in LOW RES 320x256 viene visualizzata,
  162. il PENNELLO va a capo ogni 40 bytes, mentre i dati sono tutti di seguito.
  163. Allo stesso modo, nel caso di una figura in HI-RES 640x256 il pennello va a
  164. capo ogni 80 bytes. Infatti il modulo viene automaticamente assegnato quando
  165. si setta il $dff100 (BPLCON0): se viene selezionato il LOWRES il copper sa
  166. che una figura in lowres ha 40 bytes per linea, dunque partendo a visualizzare
  167. dall'inizio dello schermo (in alto a sinistra), si legge 40 bytes e scrive col
  168. pennello elettronico la prima linea, poi "va a capo" e i dati che seguono li
  169. scrive alla linea dopo, e cosi' via. La figura in memoria pero' ha i dati tutti
  170. consecutivi, non c'e' una figura "quadrata" ! La memoria e' una fila
  171. di byte consecutivi, per cui ogni bitplane e' una linea consecutiva di dati:
  172. immaginate di dividere le 256 linee dello schermo, lunghe 40 bytes ciascuna,
  173. e di metterle l'una dopo l'altra per fare una sola linea di 40*256 bytes,
  174. ottenendone una lunga una settantina di metri: questa sarebbe la linea come
  175. e' veramente in memoria. Mettendo il modulo a zero, come abbiamo fatto fino ad
  176. ora, lasciamo andare "a capo" come il LOWRES o HIGHRES comanda, ossia ogni 40
  177. o 80 linee, e la visualizzazione e' normale. Il valore che mettiamo al modulo
  178. viene ADDIZIONATO ai puntatori ai bitplanes alla FINE della linea, ossia una
  179. volta raggiunto il byte 40. In questo modo possiamo "SALTARE" dei bytes, che
  180. non vengono visualizzati. Per esempio se aggiungiamo 40 ad ogni termine di
  181. linea ne saltiamo una intera, per cui ne viene visualizzata una ogni due,
  182. infatti:
  183.  
  184.  
  185.     - IMMAGINE NORMALE -
  186.  
  187.     ....................    ; al termine di questa linea "salto" 40 bytes
  188.     .........+..........
  189.     ........+++.........    ; e visualizzo questa linea, poi "salto"...
  190.     .......+++++........
  191.     ......+++++++.......    ; e visualizzo questa linea, poi "salto"...
  192.     .......+++++........
  193.     ........+++.........    ; e visualizzo questa linea, poi "salto"...
  194.     .........+..........
  195.     ....................    ; e visualizzo questa linea, poi "salto"...
  196.  
  197. Il risultato sara' che visualiziamo solo una linea ogni due:
  198.  
  199.     - IMMAGINE MODULO 40 -
  200.  
  201.     ....................    ; al termine di questa linea "salto" 40 bytes
  202.     ........+++.........    ; e visualizzo questa linea, poi "salto"...
  203.     ......+++++++.......    ; e visualizzo questa linea, poi "salto"...
  204.     ........+++.........    ; e visualizzo questa linea, poi "salto"...
  205.     ....................    ; e visualizzo questa linea, poi "salto"...
  206.     ....................
  207.     ....................
  208.     ....................
  209.     ....................
  210.  
  211. La figura apparira' schiacciata, lunga la meta', inoltre andremo a visualizzare
  212. anche byte "sotto" la nostra figura, dato che lo schermo finisce sempre alla
  213. linea 256: in pratica visualiziamo sempre 256 linee, ma in un raggio di 512
  214. linee di cui visualiziamo solo una linea ogni due.
  215. Provate a ricaricare Lezione5b.s e modificate i moduli nella copperlist:
  216.  
  217.     dc.w    $108,40        ; Bpl1Mod
  218.     dc.w    $10a,40        ; Bpl2Mod
  219.  
  220. Noterete che l'immagine e' alta la meta' come previsto e la parte inferiore
  221. dello schermo e' riempita dai bitplane che "avanzano", ossia dal secondo
  222. bitplane visualizzato sotto il primo, e dal terzo visualizzato sotto il secondo
  223. mentre dopo il terzo si vede la memoria dopo la figura, insomma vengono
  224. visualizzate 256 linee in un raggio di 512.
  225. Provate a saltare 2 linee, saltando 80 bytes ogni 40 visualizzati:
  226.  
  227.     dc.w    $108,40*2    ; Bpl1Mod
  228.     dc.w    $10a,40*2    ; Bpl2Mod
  229.  
  230. La figura si dimezzera' ancora, e spunteranno in basso altri bytes.
  231. Verificherete un dimezzamento dell'altezza continuando con moduli di 40*3,
  232. 40*4,40*5 eccetera, fino a rendere illeggibile il disegno.
  233. Se scegliete un modulo che non sia multiplo di 40 causerete lo "sfaldamento"
  234. dell'immagine, infatti il copper visualizzara' le linee partendo non dal loro
  235. inizio ma da una parte sempre diversa.
  236.  
  237. Vedetevi Lezione5e.s per una veloce routine che aggiunge 40 al modulo per
  238. dimezzare la figura.
  239.  
  240. I moduli oltre che positivi possono essere anche negativi. In questo caso viene
  241. sottratto il numero negativo in questione alla fine di ogni linea visualizzata.
  242. In questo caso si possono creare effetti strani: immaginatevi di mettere il
  243. modulo come -40: in questo caso, il copper legge 40 bytes, li visualizza in
  244. una linea, poi torna indietro di 40 bytes, visualizza gli stessi dati nella
  245. linea successiva, poi torna indietro di 40 bytes, e cosi' via. In pratica non
  246. avanza oltre i primi 40 bytes e ogni linea ricopia la prima linea: se per
  247. esempio abbiamo la prima linea tutta nera, le altre riprodurranno questa e lo
  248. schermo sarà tutto nero. Se ci fosse un solo punto nel mezzo della linea,
  249. questo sarebbe ridisegnato ogni linea e si produrrebbe una riga verticale:
  250.  
  251.     ..........+........    ; linea 1 (sempre ridisegnata: modulo -40!)
  252.     ..........+........    ; linea 2
  253.     ..........+........    ; linea 3
  254.     ..........+........    ; linea 4
  255.     ..........+........    ; linea 5
  256.     ..........+........    ; linea 6
  257.     ..........+........    ; linea 7
  258.     ..........+........    ; linea 8
  259.     ..........+........    ; linea 9
  260.     ..........+........    ; linea 10
  261.  
  262. Allo stesso modo ogni colore provoca una specie di "colatura" fino alla fine
  263. dello schermo. Questo effetto e' stato usato in giochi come Full Contact, nel
  264. red-sector demomaker e in moltissimi altri programmi.
  265.  
  266. Vediamo il suo funzionamento in pratica in Lezione5f.s
  267.  
  268. Suggestivo e semplice da fare, o sbaglio? E' detto anche effetto FLOOD.
  269. Il modulo viene addizionato, ogni fine linea, ai puntatori dei bitplanes che
  270. "camminano" nella memoria per visualizzare tutta la figura.
  271. Quindi addizionando un numero negativo, sottraiamo.
  272. In questo caso specifico, i puntatori dopo aver trasferito ogni linea assumono
  273. il valore X+40, vengono quindi incrementati del valore del modulo (=-40: la 
  274. lunghezza in byte di una singola riga di bitplane, al negativo): decrementati
  275. dunque di '40' byte, assumono infine di nuovo il valore X di partenza.
  276.  
  277. +---->->->--------+
  278. |                 |
  279. |BPL POINTER=  X+ 0......................................39          
  280. |                 |                                      |
  281. |INIZIO RIGA -+---xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx---+- ULTIMO BYTE ->
  282. |     (X)     |   |                                      |   |       (X+39)
  283. |             +---+                                      +---+
  284. |                 |
  285. | RIGA DOPO -+----xxxx[...]
  286. ^            |    |
  287. |            +-X+ 40  (il puntatore, dopo il trasferimento, ha camminato per
  288. ^                 |   l'intera lunghezza della riga (40 byte), fermandosi
  289. |                 |   al 40esimo che altri non e' se non il primo byte della
  290. ^                 |   riga successiva)
  291. |                 +-> (Qui viene ADDIZIONATO al puntatore di ogni plane il 
  292. |                 |   valore del modulo a lui assegnato: in questo caso '-40')
  293. |                 +-> X=X+(-40) => X=X-40 => X=0 >-+
  294. |                 |                                |
  295. +----------<-<-<--+------------<-<-<---------------+
  296.  
  297. Visto ? Il puntatore, sul piu' bello, arrivato a X+40, viene sottratto
  298. di 40 e torna all' inizio della riga appena trasferita, visualizzando ancora
  299. la stessa riga in quella sotto, in quanto il pennello elettronico cammina
  300. sempre verso il basso e disegna quanto gli viene "detto" al punto in cui si
  301. trova, in questo caso sempre la stessa riga, ripetuta.
  302.  
  303. Abbiamo visto in Lezione5f.s anche l'effetto specchio, ossia il modulo -80.
  304. Vediamolo da solo nell'esempio Lezione5g.s.
  305.  
  306. Vediamo ora come utilizzare molti $dff102 (BPLCON1) consecutivi in copperlist
  307. per creare un effetto di ondulazione: caricate Lezione5h.s
  308.  
  309. Vediamo un utilizzo particolare dello scroll con i bitplanes: Lezione5i.s e'
  310. un cosiddetto GRAPHIC-SCANNER, un antenato dei GFX-RIPPERS, ossia i programmi
  311. che "RUBANO" figure dalla memoria. Questo breve programmino serve semplicemente
  312. a mostrare la memoria CHIP, con tutte le figure visibili in essa contenute.
  313.  
  314. Ancora un esempio inerente ai moduli in Lezione5l.s, questa volta per fare un
  315. "allungamento" della figura anziche' un dimezzamento.
  316.  
  317. In Lezione5m.s vedremo un'altro metodo per spostare in basso e in alto la
  318. figura, questa volta modificando il DIWSTART ($dff08e)
  319. I registri DIWSTART e DIWSTOP determinano l'inizio e la fine della "finestra
  320. video", ossia la parte rettangolare di schermo dove vengono visualizzati i
  321. bitplanes. DIWSTART contiene le coordinate YYXX dell'angolo in alto a sinistra,
  322. dove inizia il "rettangolo video", mentre DIWSTOP contiene le coordinate
  323. dell'angolo in basso a destra:
  324.  
  325.     DIWSTART
  326.     o----------------
  327.     |        |
  328.     |        |
  329.     |        |
  330.     |        |
  331.     |        |
  332.     ----------------o
  333.               DIWSTOP
  334.  
  335. In questi registri pero' non si possono indicare tutte le possibili coordinate
  336. XX e YY, infatti sia la posizione XX che YY sono byte, e come sappiamo i byte
  337. possono raggiungere 256 diversi valori ($00-$ff).
  338. Vediamo in quali posizioni possiamo cominciare la finestra video col DiwStart
  339. e in quali possiamo terminarlo col DiwStop.
  340.  
  341.     dc.w    $8e,$2c81    ; DiwStrt YY=$2c,    XX=$81
  342.     dc.w    $90,$2cc1    ; DiwStop YY=$2c(+$ff), XX=$c1(+$ff)
  343.  
  344. La finestra video normale ha questi valori di DIWSTRT e DIWSTOP; la posizione
  345. verticale, la YY, funziona esattamente come la posizione YY dei wait del
  346. copper: infatti se col copper aspettate una linea sopra $2c e ci fate delle
  347. sfumature, non saranno visibili perche' troppo in alto, o comunque risultera'
  348. sopra qualsiasi figura visibile; analogamente al wait dopo la linea $FF la
  349. posizione riparte da $00, che sarebbe $FF+1. infatti lo schermo inizia dalla
  350. posizione verticale $2c, e finisce al $2c dopo la linea 256, ossia $FF+$2c,
  351. ossia $12b, visualizzando un totale di 256 linee, come previsto.
  352. Per esempio per uno schermo alto 200 linee dovremo mettere questo DiwStop:
  353.  
  354.     dc.w    $90,$f4c1    ; DiwStop YY=$2c(+$ff), XX=$f4
  355.  
  356. Infatti $f4-$2c = 200. Se indichiamo $00,$01... aspetteremo dopo la linea $ff.
  357. Le limitazioni sono queste: il DiwStart puo' posizionarsi verticalmente in
  358. una delle posizioni YY da $00 a $FF, ossia fino alla linea 200. La finestra
  359. video dunque non puo' comunciare dalla linea 201 o seguenti, sempre prima.
  360. Per il DIWSTOP i progettisti si sono serviti di uno stratagemma: se il valore
  361. YY e' sotto $80, ossia 128, allora aspetta le linee sotto $FF, per cui il $2c
  362. si riferisce a $2c+$FF, ossia la linea 256. Se il numero e' superiore a $80
  363. allora lo prende cosi' com'e', (dato che non esistono linee $80+$ff=383!!),
  364. e aspetta veramente le linee 129,130 eccetera. Dunque, se il DIWSTART puo'
  365. arrivare al massimo alla linea $FF partendo dallo ZERO, il DIWSTOP puo'
  366. superare la linea $FF e arrivare ai limiti del video in basso, ma non puo'
  367. partire da linee inferiori alla $80. Questo trucco e' stato fatto considerando
  368. i numeri con il bit 7 a zero (quelli, appunto, prima $80), come se avessero un
  369. ipotetico bit 8 impostato, il che aumenta tutto di $FF. Quando invece il bit
  370. 7 viene impostato (i numeri dopo $80 lo hanno impostato) allora il bit
  371. fantasma sparisce e i numeri sono presi per quello che sono.
  372. Per quanto riguarda la linea orizzontale il diwstart puo' partire da una
  373. qualsiasi XX da $00 a $FF, quindi fino alla posizione 256, (ricordatevi pero'
  374. che lo schermo parte dalla posizione $81 e non da $00, dunque e' la posizione
  375. 126 dall'inizio dello schermo!). Il DiwStop invece con $00 indica la linea
  376. 127, e proseguendo puo' raggiungere la fine del borso destro dello schermo,
  377. infatti ha il bit 8 "fantasma" sempre ad 1, per cui viene sempre aggiunto $FF
  378. al suo valore di XX.
  379. In definitiva il DiwStart puo' posizionarsi in una qualsiasi delle posizioni
  380. XX e YY da $00 a $FF, mentre il DiwStop puo' posizionarsi orizzontalmente
  381. dopo la linea $FF, e verticalmente dalla linea $80 alla linea $FF, dopodiche'
  382. i numeri da $00 a $7f sono, come nel wait dopo la linea $FF, le linee 201,202
  383. eccetera, per cui $2c e' $2c+$ff.
  384.  
  385. In Lezione5m2.s, Lezione5m3.s e Lezione5m4.s viene trattato questo argomento.
  386.  
  387.  
  388. Come termine della LEZIONE5, caricatevi Lezione5n.s, che e' un riassunto delle
  389. lezioni precedenti e in piu' e' il primo listato che suona anche la musica.
  390.  
  391. Una volta capito questo esempio, non vi resta che caricare la LEZIONE6.TXT
  392.  
  393.